package string

import (
	"fmt"
	"unicode/utf8"
)

/** string 字符串类型*/

// 示例1
func caes1() {
	// 定义字符串方式1
	var str1 string = "Hello World!"
	fmt.Println(str1)

	// 定义字符串方式2
	str2 := "Hello World!"
	str22 := "Señor"
	fmt.Println(str2)

	// 获取字符串长度
	fmt.Println("获取str2 字符串长度 ", len(str2)) //len() 对于str22 获取的长度就不准确！！
	fmt.Println("获取str22 字符串长度 ", utf8.RuneCountInString(str22))
	fmt.Println("获取str2 字符串长度 ", utf8.RuneCountInString(str2))

	// 获取字符串中的每一个字节
	for i := 0; i < len(str2); i++ {
		fmt.Printf("%c  ", str2[i])
	}
	fmt.Println()

	// 针对于特殊符号字符串遍历
	str3 := "Señor"
	runes := []rune(str3)
	for i := 0; i < len(runes); i++ {
		fmt.Printf("%c  ", runes[i])
	}
	fmt.Println()

	// 兼容处理range
	for index, rune := range str3 {
		fmt.Printf("%c starts at byte %d  \n", rune, index)
	}

	// 用字节切片构造字符串
	byteSlice := []byte{0x43, 0x61, 0x66, 0xC3, 0xA9}
	str5 := string(byteSlice)
	fmt.Println(str5)

	// 用 rune 切片构造字符串
	runeSlice := []rune{0x0053, 0x0065, 0x00f1, 0x006f, 0x0072}
	str6 := string(runeSlice)
	fmt.Println(str6)

	// 字符串是不可变的
	str7 := "abcdefghijklmiopqwyz"
	fmt.Println(str7)
	str7 = "asdf"
	fmt.Println(str7)
}

func Test() {

	caes1()
}
